package edu.utn.tacs.grupouno.negocio;

import java.util.UUID;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ManyToOne;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import edu.utn.tacs.grupouno.dao.PersistentObject;
import edu.utn.tacs.grupouno.exception.IndicadorSinResultadoException;
import edu.utn.tacs.grupouno.exception.SystemException;

@Entity
@XmlRootElement
public class Indicador extends PersistentObject implements Cloneable {
	
	private static final long serialVersionUID = -3076365736948474928L;
	
	@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
	@XmlElementRefs({
		@XmlElementRef(type=ColorValorReferencia.class),
		@XmlElementRef(type=RangoValorReferencia.class)
	})
	private ValorDeReferencia valor;
	
	@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
	@XmlElementRefs({
		@XmlElementRef(type=ResultadoNumerico.class),
		@XmlElementRef(type=ResultadoColor.class)
	})
	private Resultado resultado;

	private String nombre="";

	public Indicador() {
	}

	public Indicador(ValorDeReferencia valor) {
		this.valor = valor;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public boolean estaOk() {
		if (tieneResultado()) {
			return valor.isNormal(resultado);
		}
		throw new IndicadorSinResultadoException();
	}
	
	public boolean tieneResultado() {
		return resultado != null;
	}

	@Override
	public Object clone(){
		try {
			
			Indicador indicadorClone = (Indicador) super.clone();
			indicadorClone.setId(UUID.randomUUID());
			return indicadorClone;
		}
		catch (CloneNotSupportedException e) {
			throw new SystemException("No se pudo clonar indicador!");
		}
	}

	@XmlTransient
	public Resultado getResultado() {
		return resultado;
	}

	public void setResultado(Resultado resultado) {
		this.resultado = resultado;
	}

	@XmlTransient
	public ValorDeReferencia getValor() {
		return valor;
	}

	public void setValor(ValorDeReferencia valor) {
		this.valor = valor;
	}
}
